// 创建一个名为 websocket.js 的文件用于封装 WebSocket 相关操作
import { vipSaveStore } from "@/utils/vip.js"
import { global } from "@/utils/index"
import { WEBSOCKET } from "@/utils/constant.js"
		
let socket = null;
let messageQueue = [];
let isConnecting = false;

const wsUrl = () => {
	const userInfo = global.syncGetUerInfoByLocal()
	if(userInfo?.memberId){
		return `${WEBSOCKET}${userInfo.memberId}`
	}else {
		return undefined
	}
}

// 连接 WebSocket 服务器
function connectWebSocket(wsapi) {
	let url = wsapi ? wsapi : wsUrl()
	if(!url){
		console.log("websocket链接地址不对", url)
		return
	}
	console.log("socket 实例", socket, socket?.readyState)
    if (socket && socket?.readyState === 1) { // 0 - CONNECTING：连接尚未建立。1 - OPEN：连接已建立，可以进行通信。2 - CLOSING：连接正在进行关闭操作。3 - CLOSED：连接已经关闭或者连接不能打开。
        return;
    }
    isConnecting = true;
    socket = uni.connectSocket({
        url, 
		success: (res) => {
			console.log('WebSocket连接成功', socket, res);
			// setTimeout(() => {
			// 	console.log("实例", socket)
			// }, 5000)
			uni.$emit("wxConnectStatus", true)
	    },
	    fail: (err) => {
			console.error('WebSocket连接失败', err);
			uni.$emit("wxConnectStatus", false)
		}
        // 根据实际情况配置其他参数
    });
    socket.onOpen(() => {
        isConnecting = false;
        // 发送队列中的消息
        messageQueue.forEach(item => {
			console.log("队列消息", item)
            // socket.send({
            //     data: item
            // });
        });
        messageQueue = [];
    });
    socket.onClose((res) => {
        isConnecting = false;
		console.log("ws 关闭", res)
        // 尝试重新连接
        // setTimeout(connectWebSocket, 3000);
    });
    socket.onError(() => {
        isConnecting = false;
        // 尝试重新连接
        setTimeout(connectWebSocket, 3000);
    });
    socket.onMessage((res) => {
        const data = JSON.parse(res.data);
        // 存储数据，可以使用 Vuex 或者其他全局存储方式
        uni.$emit('websocketMessage', data);
		vipSaveStore(data)
    });
}

// 发送消息
function sendMessage(data) {
    if (socket && socket.readyState === 1) {
        socket.send({
            data: JSON.stringify(data)
        });
    } else {
        messageQueue.push(JSON.stringify(data));
    }
}

// 全局监听消息
function initWebSocket() {
    uni.$on('websocketMessage', (data) => {
        // 在这里处理接收到的数据，比如存储数据
        console.log('这里是全局监听:', data);
    });
}

// 关闭 WebSocket 连接
function closeWebSocket({reconnect, mode} = {}) { // reconnect: 重连函数，  mode: 'exit': 退出，不需要重连 againConnect
    if (socket) {
        socket.close();
		// console.log('ws关闭', socket)
		// const notConect = socket === null ? true : (socket.readyState === 0 || socket.readyState === 3)
		// if(mode === "againConnect" && typeof reconnect === "function" &&  notConect){
		// 	reconnect?.() // 重连
		// 	console.log("关闭之后的重连", reconnect)
		// }
    } else {
		console.log("ws 还未连接")
		// const notConect = socket === null ? true : (socket.readyState === 0 || socket.readyState === 3)
		// if(mode === "againConnect" && typeof reconnect === "function" &&  notConect){
		// 	reconnect?.() //  重连
		// 	console.log("关闭之后的重连", reconnect)
		// }
	}
}

let timer = null
let MAX = 5
let COUNT = 0;
// 检查 WebSocket 的 readyState
function checkAndReconnectIfClosed() {
	console.log("重连", socket?.readyState)
	COUNT += 1
	if(socket === null){
		// clearInterval(timer)
		console.log("ws还未初始化开始去连接", socket)
		if(COUNT >= MAX){
			clearInterval(timer)
			timer = null
			return
		}
		connectWebSocket()
		return;
	}
    if (socket.readyState === 0 || socket.readyState === 3) { // CLOSED
        console.log('WebSocket 已关闭，尝试重新连接...');
		socket.close()
		if(COUNT >= MAX){
			clearInterval(timer)
			timer = null
			return
		}
        connectWebSocket()
    }
	if(socket.readyState === 1){
		clearInterval(timer)
		timer = null
	}
}

// 定期检查 WebSocket 状态并尝试重连 // 抖音，快手小程序都不需要websocket
// timer = setInterval(checkAndReconnectIfClosed, 5000); // 每 5 秒检查一次

// 导出函数
export default {
    connectWebSocket,
    sendMessage,
    initWebSocket,
    closeWebSocket
};
